﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;
using System.Data.Common;

namespace _70_516
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Primeiro Exemplo com DbCommand
        /// </summary>
        private void DbCommand() 
        {
            // Pega a string de conexão
            var connString = ConfigurationManager.ConnectionStrings["ConnnectionString"].ConnectionString;
            // Cria uma objeto de conexão
            var conn = new SqlConnection(connString);
            // Cria um objeto de comando 
            var cmd = conn.CreateCommand();
            // Define o tipo de comando
            cmd.CommandType = CommandType.StoredProcedure;
            // Qual o nome da stored procedure
            cmd.CommandText = "CustOrderHist";
            // Cria os parametro
            DbParameter param = cmd.CreateParameter();
            // Define seu nome
            param.ParameterName = "@Id";
            // Define seu valor
            param.Value = "ANATR";
            // Adiciona a coleção de parametros
            cmd.Parameters.Add(param);
        }

        /// <summary>
        /// ExecuteNonQuery retorna o número de rows afetada pela operação
        /// </summary>
        private void ExecuteNonQuery() 
        {
            // Pega a string de conexão
            var connString = ConfigurationManager.ConnectionStrings["ConnnectionString"]; 
            int count = 0;
            // Cria uma objeto de conexão
            using (var connection = new SqlConnection()) 
            {
                // Atribui a string de conexão
                connection.ConnectionString = connString.ConnectionString;
                // Cria um objeto de comando 
                var cmd = connection.CreateCommand();
                // Define o tipo de comando
                cmd.CommandType = CommandType.Text;
                // Define o comando SQL
                cmd.CommandText = "UPDATE Products SET UnitPrice = UnitPrice * 1.1 WHERE ProductID = 1"; 
                // Abre a conexão 
                connection.Open(); 
                // Executa o método
                count = cmd.ExecuteNonQuery(); 
            } 
            MessageBox.Show(count.ToString()); 
        }

        /// <summary>
        /// ExecuteReader retorna um objeto do tipo SqlDataReader e anda para
        /// frente não retornando a uma linha lida. Seus dados estão disponíveis
        /// somente para leitura.
        /// Um objeto DbDataReader só pode ser criado a partir do método ExecuteReader 
        /// do DbCommand
        /// </summary>
        private void ExecuteReader() 
        {
            // Pega a string de conexão            
            var connString = ConfigurationManager.ConnectionStrings["ConnnectionString"];
            // Cria uma objeto de conexão
            var connection = new SqlConnection();
            // Atribui a string de conexão
            connection.ConnectionString = connString.ConnectionString;
            // Cria um objeto de comando 
            var cmd = connection.CreateCommand();
            // Define o tipo de comando
            cmd.CommandType = CommandType.Text;
            // Define o comando SQL
            cmd.CommandText = "SELECT ProductID, UnitPrice FROM Products";
            // Abre a conexão 
            connection.Open();
            // Executa o método retornando um DbReader
            DbDataReader rdr = cmd.ExecuteReader();
            // Vai para o próximo registro de leitura
            while (rdr.Read())
            {
                // Adiciona o registro no listview1
                listView1.Items.Add(rdr["ProductID"] + ": " + rdr["UnitPrice"]);
            }
            // fecha a conexão
            connection.Close(); 
        }

        /// <summary>
        /// Este tipo de consultas são geralmente esperado para retornar uma única linha
        /// com uma única coluna. Nestas situações, os resultados podem ser tratados como
        /// um único valor de retorno. Por exemplo, o SQL a seguir retorna um resultado que
        /// consiste em uma única linha com uma única coluna. SELECT COUNT(*) FROM Products
        /// </summary>
        private void ExecuteScalar() 
        {
            // Pega a string de conexão
            var connString = ConfigurationManager.ConnectionStrings["ConnnectionString"];
            // Cria uma objeto de conexão
            var connection = new SqlConnection();
            // Atribui a string de conexão
            connection.ConnectionString = connString.ConnectionString;
            // Cria um objeto de comando
            var cmd = connection.CreateCommand();
            // Define o tipo de comando
            cmd.CommandType = CommandType.Text;
            // Define o comando SQL
            cmd.CommandText = "SELECT COUNT(*) FROM Products";
            // Abre a conexão 
            connection.Open();
            // Executa o método
            int count = (int)cmd.ExecuteScalar();
            // fecha a conexão
            connection.Close();
            MessageBox.Show(count.ToString());
        }

        /// <summary>
        /// Carrega os dados de um DbDataReader para um Data Table
        /// </summary>
        private void DbDataReader() 
        {
            // Pega a string de conexão
            var connString = ConfigurationManager.ConnectionStrings["ConnnectionString"];
            // Cria uma objeto de conexão
            var connection = new SqlConnection();
            // Atribui a string de conexão
            connection.ConnectionString = connString.ConnectionString;            
            // Cria um objeto de comando
            var cmd = connection.CreateCommand();
            // Define o tipo de comando
            cmd.CommandType = CommandType.Text;
            // Define o comando SQL
            cmd.CommandText = "SELECT ProductID, ProductName FROM Products";
            // Abre a conexão 
            connection.Open();
            // Executa o método
            var rdr = cmd.ExecuteReader();
            // Cria o DataTable
            var products = new DataTable();
            // Carrega os dados
            products.Load(rdr, LoadOption.Upsert);
            // Fecha a conexão
            connection.Close();
            // Fonte da dados para comboBox
            cmbProducts.DataSource = products;
            // Exibido no display
            cmbProducts.DisplayMember = "ProductName";
            // Valor de "índice"
            cmbProducts.ValueMember = "ProductID";
        }

        /// <summary>
        /// Executa o DbCommand
        /// </summary>
        /// <param name="sender">objeto enviado</param>
        /// <param name="e">argumentos enviados</param>
        private void dbCommandToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DbCommand();
        }

        /// <summary>
        /// Executa o método ExecuteNonQuery
        /// </summary>
        /// <param name="sender">objeto enviado</param>
        /// <param name="e">argumentos enviados</param>
        private void executeNonQueryToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExecuteNonQuery();
        }
        
        /// <summary>
        /// Executa o método ExecuteReader
        /// </summary>
        /// <param name="sender">objeto enviado</param>
        /// <param name="e">argumentos enviados</param>
        private void executeReaderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExecuteReader();
        }

        /// <summary>
        /// Executa o método ExecuteScalar
        /// </summary>
        /// <param name="sender">objeto enviado</param>
        /// <param name="e">argumentos enviados</param>
        private void excuteScalarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExecuteScalar();
        }


        /// <summary>
        /// Executa o método ExecuteReader e carreg um datatable
        /// </summary>
        /// <param name="sender">objeto enviado</param>
        /// <param name="e">argumentos enviados</param>
        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            DbDataReader();
        }

        /// <summary>
        /// Sai da aplicação
        /// </summary>
        /// <param name="sender">objeto enviado</param>
        /// <param name="e">argumentos enviados</param>
        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


        private void UsingConectando()
        {
            using (SqlConnection conn = new SqlConnection(
                ConfigurationManager.ConnectionStrings["ConnnectionString"].ConnectionString))
            {
                conn.Open();
                ///
                /// Regra
                ///
            }
        }
    }
}
